package com.xufx.thread.liaoxuefeng.thread15_threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Created by xufx on 2022/1/5 21:40
 * 线程的创建和销毁是一个很重的过程，使用线程池可以最大程度的减少消耗。让一组线程执行很多小任务
 * 简单地说：  线程池内部维护了若干个线程，没有任务的时候，这些线程处于等待状态。如果有新任务，就分配一个空闲线程执行。
 *           如果所有线程都处于忙碌状态，新任务要么放入队列等待，要么增加一个新线程处理。
 * Java提供了ExecutorService接口表示线程池
 * 1. 线程结束的时候通过shutdown()方法关闭线程池-->正在执行的任务会优先执行，然后关闭
 * 2. shutdownNow()会立即停止线程池
 * 3. awaitTermination()会等待指定的时间后关闭
 *
 * 对于线程池CachedThreadPool，线程池会根据任务数量动态调整线程数量
 *
 * ScheduledThreadPool:定时任务线程池使用示例如代码
 *
 * Timer:已经被取代了，除非到万不得已，不然别用
 */
public class Main {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
//        ExecutorService executor = Executors.newFixedThreadPool(3);
//        executor.submit(()->{
//            System.out.println(Thread.currentThread().getName());
//        });
//        executor.submit(()->{
//            System.out.println(Thread.currentThread().getName());
//        });

        scheduledExecutorService.schedule(new Task("one-time"), 1, TimeUnit.SECONDS);
        scheduledExecutorService.scheduleAtFixedRate(new Task("fixed-rate"), 2, 3, TimeUnit.SECONDS);
        scheduledExecutorService.scheduleWithFixedDelay(new Task("fixed-delay"), 2, 3, TimeUnit.SECONDS);
    }
}

class Task implements Runnable{

    private String name;

    public Task(String s) {
        this.name = s;
    }

    @Override
    public void run() {
        System.out.println(name);
    }
}


